QGraphicsView移动图元/场景以及坐标转换

您所在的位置:网站首页 qt 图片移动 QGraphicsView移动图元/场景以及坐标转换

QGraphicsView移动图元/场景以及坐标转换

2024-07-11 08:25| 来源: 网络整理| 查看: 265

使用Qt来画图的时候,需要了解一下QGraphicsView(视图)、QGraphicsScene(场景)、QGraphicsItem(图元),已经他们之间的关系。

通过把各种 图元(基类都是:QGraphicsItem)组合在一起搭建成场景(QGraphicsScene),把搭建好的场景通过视图展示出来(QGraphicsView)。

通过一个示例来展示,选中图元的时候可以移动图元,选中空白的时候可以移动整个场景: 在这里插入图片描述

1.坐标转换

这三者之间的存在不同的坐标系,他们之间需要坐标转换,而且只用QGraphicsItem和QGraphicsView有坐标转换的功能,也就是说QGraphicsItem和QGraphicsView都可以QGraphicsScene直接进行坐标转换,但是QGraphicsItem和QGraphicsView之间的坐标转换需要通过QGraphicsScene进行转换。

所有的图元QGraphicsItem都是放到QGraphicsScene中,所以QGraphicsScene是所有的图元的父图元。

常用的坐标转换函数:

QGraphicsView::mapToScene() - 视图 -> 场景 QGraphicsView::mapFromScene() - 场景 -> 视图 QGraphicsItem::mapFromScene() - 场景 -> 图元 QGraphicsItem::mapToScene() - 图元 -> 场景 QGraphicsItem::mapToParent() - 子图元 -> 父图元 QGraphicsItem::mapFromParent() - 父图元 -> 子图元 QGraphicsItem::mapToItem() - 本图元 -> 其他图元 QGraphicsItem::mapFromItem() - 其他图元 -> 本图元 2.图元/场景移动

如果是移动单个图元的话,

setFlag(QGraphicsItem::ItemIsMovable, true);//可以拖动 setFlag(QGraphicsItem::ItemIsSelectable, true);//可以选中

贴上代码: 自定义图元:

#pragma once #include class IGraphicsCoord; class AAAEllipseItem : public QGraphicsEllipseItem { public: AAAEllipseItem(QGraphicsItem *parent); ~AAAEllipseItem(); inline void setCoord(IGraphicsCoord* coord){ _graphicsCoord = coord; } private: virtual void mousePressEvent(QGraphicsSceneMouseEvent *event)Q_DECL_OVERRIDE; virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event)Q_DECL_OVERRIDE; virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event)Q_DECL_OVERRIDE; private: IGraphicsCoord* _graphicsCoord = nullptr; QPointF _mousePress; }; #include "AAAEllipseItem.h" #include #include #include #include "IGraphicsCoord.h" AAAEllipseItem::AAAEllipseItem(QGraphicsItem *parent) : QGraphicsEllipseItem(parent) { setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); QPen pen; pen.setColor(QColor(247, 99, 0)); pen.setWidth(3); setPen(pen); } AAAEllipseItem::~AAAEllipseItem() { } void AAAEllipseItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { QGraphicsEllipseItem::mousePressEvent(event); qDebug() pos()); qDebug() pos()); QPointF movePt = ptNow - mapToScene(_mouseLBtnDown); //根据鼠标当前的点作为定位点 setTransformationAnchor(QGraphicsView::AnchorUnderMouse); QPoint nowCenter(-movePt.x(), -movePt.y()); //qDebug() addLine(0.0, 0.0, 0.0, 100.0); AAAGraphicsView* view = new AAAGraphicsView(this); e1->setCoord(view); //view->setAlignment(Qt::AlignLeft | Qt::AlignTop); view->setScene(scene); ui.verticalLayout->addWidget(view) ; }

运行之后,当点击一个图元的时候,输出的信息:

AAAEllipseItem: 54 43 AAAEllipseItem mapToScene: 54 43 AAAGraphicsScene: 54 43 AAAGraphicsView: 357 304

这也说明了,鼠标事件传递的顺序: 图元-> 场景->视图 QGraphicsItem -> QGraphicsScene -> QGraphicsView 视图和图元的交互是通过场景来装换的。

aaa



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3